package com.cloud.bssp.gateway.controller;

import cn.hutool.core.util.ObjectUtil;
import com.cloud.bssp.gateway.config.redis.RedisUtil;
import com.cloud.bssp.gateway.dto.UserDTO;
import com.cloud.bssp.gateway.enums.CommonReturnEnum;
import com.cloud.bssp.gateway.feign.UserClient;
import com.cloud.bssp.gateway.util.JwtUtil;
import com.cloud.bssp.gateway.util.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

/**
 * description: 登录controller
 *
 * @author: weirx
 * @time: 2021/3/29 9:36
 */
@RestController
@RequestMapping("/user")
public class LoginController {

    @Autowired
    private UserClient userClient;

    @Autowired
    private RedisUtil redisUtil;

    /**
     * description: 登录
     *
     * @param user
     * @return: com.baomidou.mybatisplus.extension.api.R
     * @author: weirx
     * @time: 2021/3/26 14:48
     */
    @PostMapping("/login")
    public R login(@RequestBody UserDTO user) {
        //用户名密码需要加密处理
        if (ObjectUtil.isEmpty(user) || StringUtils.isEmpty(user.getUsername())
                || StringUtils.isEmpty(user.getPassword())) {
            return R.failed("Username or password is null, login failed.");
        }

        //去登陆
        R r = this.doLogin(user);
        if (r.getCode() != CommonReturnEnum.SUCCESS.getCode()) {
            return r;
        }
        String token = JwtUtil.generateToken(user.getUsername());
        //token放入redis
        redisUtil.setObjectExpire(JwtUtil.TOKEN_CACHE_PREFIX + user.getUsername(), token,
                JwtUtil.TOKEN_REDIS_EXPIRE, TimeUnit.MINUTES);
        return R.success("Login success", token);
    }

    private R doLogin(UserDTO user) {
        R r = userClient.login(user);
        return r;
    }

    @PostMapping("/logout")
    public R logout(@RequestBody UserDTO user) {
        //用户名密码需要加密处理
        if (ObjectUtil.isEmpty(user) || StringUtils.isEmpty(user.getUsername())) {
            return R.failed("Username is null, logout failed.");
        }
        //判断token
        if (StringUtils.isEmpty(user.getToken())) {
            return R.failed("Token is null, logout failed.");
        }
        //获取redis的token，看看是否存在
        String token = redisUtil.getObject(JwtUtil.TOKEN_CACHE_PREFIX + user.getUsername());
        if (StringUtils.isEmpty(token)) {
            return R.failed("The token is invalid");
        }
        if (!token.equals(user.getToken())) {
            return R.failed("The token is invalid");
        }
        //验证token是否正确
        //没过期，对比当前token和缓存的token是否一致
        if (!token.equals(user.getToken())) {
            return R.failed("Username or token is invalid");
        }

        //清除token
        redisUtil.deleteObject(JwtUtil.TOKEN_CACHE_PREFIX + user.getUsername());
        return R.success("Logout success");
    }
//
//    @PostMapping("/refresh")
//    public R refresh(@RequestBody UserDTO user) {
//        //判断用户名
//        if (ObjectUtil.isEmpty(user) || StringUtils.isEmpty(user.getUsername())) {
//            return R.failed("Username is null, logout failed.");
//        }
//        //判断token
//        if (StringUtils.isEmpty(user.getToken())) {
//            return R.failed("Token is null, refresh failed.");
//        }
//        //获取redis的token，看看是否存在
//        String token = redisUtil.getObject(JwtUtil.TOKEN_CACHE_PREFIX + user.getUsername());
//        if (StringUtils.isEmpty(token)) {
//            return R.failed("Token is timeout, please login again");
//        }
//        if (!token.equals(user.getToken())) {
//            return R.failed("The token is invalid");
//        }
//        //验证token是否正确
//        boolean b = JwtUtil.validateTokenAndUser(user.getToken(), user.getUsername());
//        if (!b) {
//            return R.failed("Username or token is invalid, please login again");
//        }
//        //重新生成token
//        token = JwtUtil.generateToken(user.getUsername());
//        //token放入redis
//        redisUtil.setObjectExpire(JwtUtil.TOKEN_CACHE_PREFIX + user.getUsername(), token,
//                JwtUtil.TOKEN_REDIS_EXPIRATION_DAY, TimeUnit.MINUTES);
//        return R.success("Refresh success", token);
//    }
}